package cn.ad.server.web.spring.service.actions.handler.adview;//package cn.ad.server.web.spring.service.actions.handler.adview;
//
//import java.math.BigDecimal;
//import java.util.ArrayList;
//import java.util.HashSet;
//import java.util.List;
//import java.util.Map;
//import java.util.Random;
//import java.util.Set;
//import java.util.concurrent.ConcurrentHashMap;
//import java.util.concurrent.ConcurrentMap;
//
//import javax.annotation.PostConstruct;
//import javax.annotation.Resource;
//
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.util.CollectionUtils;
//
//import cn.ad.server.common.utils.SpringContextUtils;
//import cn.falconnect.adserver.adapter.BalanceMatcher;
//import cn.falconnect.adserver.adapter.BidFloorMatcher;
//import cn.falconnect.adserver.adapter.BidMatcherChain;
//import cn.falconnect.adserver.adapter.CreativeInteractionMatcher;
//import cn.falconnect.adserver.adapter.DayTargetMatcher;
//import cn.falconnect.adserver.adapter.DeviceMatcher;
//import cn.falconnect.adserver.adapter.GeoTargetMatcher;
//import cn.falconnect.adserver.adapter.StrategyFormatMatcher;
//import cn.falconnect.adserver.adapter.TimeRangeMatcher;
//import cn.falconnect.adserver.adapter.AdImpression;
//import cn.falconnect.adserver.adapter.AdNative;
//import cn.falconnect.adserver.adapter.Exchange;
//import cn.falconnect.adserver.adapter.AdViewActionType;
//import cn.falconnect.adserver.adapter.BidFlag;
//import cn.falconnect.adserver.adapter.RequestAsset;
//import cn.falconnect.adserver.adapter.TrackCommand;
//import cn.falconnect.adserver.adapter.BidContext;
//import cn.falconnect.adserver.adapter.ConvertTargetUrlHandler;
//import cn.falconnect.adserver.adapter.IConvertTargetUrl;
//import cn.ad.server.biz.internal.AdService;
//import cn.ad.server.domain.ad.AdMaterial;
//import cn.ad.server.domain.ad.AdMaterialGroup;
//import cn.ad.server.domain.ad.AdSize;
//import cn.ad.server.domain.ad.AdTemplate;
//import cn.ad.server.domain.ad.AuditPassedMarker;
//import cn.ad.server.domain.ad.Campaign;
//import cn.ad.server.domain.ad.Creative;
//import cn.ad.server.domain.ad.GuidValueObject;
//import cn.ad.server.domain.ad.InteractionApp;
//import cn.ad.server.domain.ad.InteractionRedirects;
//import cn.ad.server.domain.ad.Strategy;
//import cn.ad.server.domain.enumration.ActionType;
//import cn.ad.server.domain.enumration.AdFormat;
//import cn.ad.server.domain.enumration.FeeType;
//
///**
// * @author dongbin.yu
// * @from 2016-07-28
// * @since V1.0
// * 此类在2.0版本后不推荐使用，请不要维护此代码
// */
//@Deprecated
//public abstract class ImpressionHandler<T> {
//
//	private List<BidMatcherChain> matcherChain;
//
//	@Resource(name="targetUrlConvert")
//	public Map<String,IConvertTargetUrl> targetUrlConvert;
//	
//	@Autowired
//	public ConvertTargetUrlHandler convertTargetUrlHandler;
//	
//	@Autowired
//	protected AdService adService;
//	
//	protected T strategyFilter(Set<Strategy> strategyList, BidContext bidContext, AdTemplate adTemplate,
//							   AdNative adNative, int width, int height, boolean serverFilter, int platformId, long adSpaceId) {
//
//		ConcurrentMap<Integer, HashSet<Entry>> campaignCache = new ConcurrentHashMap<>();
//		HashSet<Entry> entryList = new HashSet<>(10);
//		if(platformId == 0) platformId = Integer.parseInt(getExchange().getValue());
//
//		filter:
//		for (Strategy strategy : strategyList) {
//			
//			if(strategy.getCampaign() == null)
//				continue;
//			
//			HashSet<Entry> strategyEntryList = new HashSet<>(10);
//
//			for (BidMatcherChain chain : matcherChain) {
//				if (serverFilter && chain instanceof StrategyFormatMatcher) {
//					continue;
//				}
//				//当不是sts且chain是CreativeInteractionMatcher时，跳过这个过滤。 
//				if (!serverFilter && chain instanceof CreativeInteractionMatcher) {
//					continue;
//				}
//
//				if (!chain.match(strategy, bidContext)) {
//					if (bidContext.isDebugMode()) {
//						System.out.println(strategy.getId() + ":" + chain.getClass().getSimpleName());
//					}
//					continue filter;
//				}
//			}
//
//			if (strategy.getCampaign() == null) continue;
//			int campaignId = strategy.getCampaign().getId();
//
//			Set<Creative> creativeList = null;
//			if (!serverFilter) {
//				if (campaignCache.containsKey(campaignId)) {
//					HashSet<Entry> entryCampaignList = campaignCache.get(campaignId);
//
//					for (Entry entry : entryCampaignList) {
//						Entry cloneEntry = (Entry) entry.clone();
//						cloneEntry.strategyId = strategy.getId();
//						cloneEntry.priority = strategy.getPriority();
//						cloneEntry.price = strategy.getUnitPrice();
//						cloneEntry.feeType = strategy.getFeeType() == FeeType.CPC.getValue() ? "CPC" : "CPM";
//						entryList.add(cloneEntry);
//					}
//
//					continue;
//				}
//
//				Campaign campaign = adService.fetchCampaignById(strategy.getCampaign().getId());
//
//				if (campaign == null) continue;
//				creativeList = campaign.getCreatives();
//			} else {
////				creativeList = new HashSet<>(strategy.getCreatives());
//				creativeList = new HashSet<>(strategy.getMatchCreatives());
//			}
//
//			if (creativeList == null) continue;
//
//			if (creativeList != null) {
//				for (Creative creative : creativeList) {
//					AdFormat adFormat = creative.getAdFormat();
//					if (adFormat.getValue() == bidContext.getAdFormat()) {
//
//						switch (adFormat) {
//							case BANNER:
//							case TABLE_SCREEN:
//							case OPEN_SCREEN:
//
//								Set<AdMaterial> adMaterials = creative.getAdMaterialSet();
//								if (adMaterials != null) {
//									for (AdMaterial adMaterial : adMaterials) {
//
//										List<AuditPassedMarker> auditPassedMarkers = adMaterial.getAuditPassedMarkers();
//										if (platformCheck(auditPassedMarkers, platformId)) {
//											AdSize adSize = adMaterial.getAdSize();
//
//											if (adSize.getWidth() == width && adSize.getHeight() == height) {
//
//												Entry entry = new Entry();
//												entry.priority = strategy.getPriority();
//												entry.strategyId = strategy.getId();
//												entry.campaignId = campaignId;
//												entry.platformId = platformId;
//												entry.adSpaceId = adSpaceId;
//												entry.creativeId = creative.getId();
//												if (!CollectionUtils.isEmpty(auditPassedMarkers)) {
//													entry.auditId = auditPassedMarkers.get(0).getAuditId();
//												}
//												fetchCreativeTargetUrl(creative, entry);
//												entry.adFormat = adFormat.getValue();
//												entry.price = strategy.getUnitPrice();
//												entry.width = width;
//												entry.height = height;
//												entry.feeType = strategy.getFeeType() == FeeType.CPC.getValue() ? "CPC" : "CPM";
//												entry.materialId = adMaterial.getId();
//												entry.materialUrl = adMaterial.getMaterialUrl();
//												entry.impressionTracking = creative.getImpressionTracking();
//												entry.clicksTracking = creative.getClicksTracking();
//
//												entryList.add(entry);
//												strategyEntryList.add(entry);
//											}
//										}
//									}
//								}
//								break;
//							case VIDEO:
//								break;
//							case AD_NATIVE:
//
//								List<AuditPassedMarker> auditPassedMarkers = creative.getAuditPassedMarkers();
//								if (platformCheck(auditPassedMarkers, platformId)) {
//
//									int templateId = 0;
//									for (AdMaterialGroup adMaterialGroup : (serverFilter ? creative.getAdMaterialGroups() : creative.getAdMaterialGroupSet())) {
//										templateId = adMaterialGroup.getAdTemplate().getId();
//										break;
//									}
//
//									if (templateId != adTemplate.getId()) {
//										continue;
//									} else {
//										Entry entry = new Entry();
//										entry.priority = strategy.getPriority();
//										entry.strategyId = strategy.getId();
//										entry.campaignId = campaignId;
//										entry.platformId = platformId;
//										entry.adSpaceId = adSpaceId;
//										entry.creativeId = creative.getId();
//										if (!CollectionUtils.isEmpty(auditPassedMarkers)) {
//											entry.auditId = auditPassedMarkers.get(0).getAuditId();
//										}
//										fetchCreativeTargetUrl(creative, entry);
//										entry.adFormat = adFormat.getValue();
//										entry.price = strategy.getUnitPrice();
//										entry.feeType = strategy.getFeeType() == FeeType.CPC.getValue() ? "CPC" : "CPM";
//										entry.templateId = adTemplate.getId();
//										entry.adMaterialGroups = serverFilter ? new HashSet<>(creative.getAdMaterialGroups()) : creative.getAdMaterialGroupSet();
//										entry.impressionTracking = creative.getImpressionTracking();
//										entry.clicksTracking = creative.getClicksTracking();
//										storeTemplateSpec(entry, adNative);
//
//										entryList.add(entry);
//										strategyEntryList.add(entry);
//									}
//								}
//
//								break;
//							default:
//								break;
//
//						}
//
//					}
//				}
//			}
//			campaignCache.putIfAbsent(campaignId, strategyEntryList);
//		}
//
//		if (entryList.size() == 0) {
//			return null;
//		}
//
//		Set<Entry> priorityEntryList = priorityEntry(entryList);
//		Entry entry = new ArrayList<>(priorityEntryList).get(new Random().nextInt(priorityEntryList.size()));
//
//		bidRecordLog(bidContext, entry);
//		storeGuid(bidContext, entry);
//
//		return compositeBid(bidContext, entry);
//
//	}
//
//	private boolean platformCheck(List<AuditPassedMarker> auditPassedMarkers,int platformId) {
//
//		if (auditPassedMarkers == null) {
//			return false;
//		}
//		for (AuditPassedMarker auditPassedMarker : auditPassedMarkers) {
//			if (auditPassedMarker.getPlatformId() == platformId) {
//				return true;
//			}
//		}
//
//		return false;
//
//	}
//
//	public abstract Exchange getExchange();
//
//	public abstract T handler(AdImpression impression, BidContext bidContext);
//
//	public abstract T compositeBid(BidContext bidContext, Entry entry);
//
//	public abstract void storeTemplateSpec(Entry entry, AdNative adNative);
//
//	protected class Entry implements Cloneable {
//
//		private int platformId;
//
//		private long adSpaceId;
//
//		private long strategyId;
//
//		private int priority;
//
//		private long creativeId;
//
//		private int campaignId;
//
//		private int adFormat;
//
//		private BigDecimal price;
//
//		/**
//		 * CPC | CPM
//		 */
//		private String feeType;
//
//		/**
//		 * 0:null,1:direct,2:download
//		 */
//		private int interactionType;
//
//		private long materialId;
//
//		private int screenPosition;
//
//		private int[] excludeCreativeType;
//
//		private int[] includeMimes;
//
//		private String auditId;
//
//		/**
//		 * 素材地址
//		 */
//		private String materialUrl;
//
//		private String targetUrl;
//
//		private int width;
//
//		private int height;
//
//		private int templateId;
//
//		private Set<AdMaterialGroup> adMaterialGroups;
//
//		private RequestAsset[] assets;
//
//		private String impressionTracking;
//
//		private String clicksTracking;
//
//		public long getAdSpaceId() {
//			return adSpaceId;
//		}
//
//		public void setAdSpaceId(long adSpaceId) {
//			this.adSpaceId = adSpaceId;
//		}
//
//		public int getPlatformId() {
//			return platformId;
//		}
//
//		public void setPlatformId(int platformId) {
//			this.platformId = platformId;
//		}
//
//		public String getAuditId() {
//			return auditId;
//		}
//
//		public void setAuditId(String auditId) {
//			this.auditId = auditId;
//		}
//
//		public int[] getExcludeCreativeType() {
//			return excludeCreativeType;
//		}
//
//		public void setExcludeCreativeType(int[] excludeCreativeType) {
//			this.excludeCreativeType = excludeCreativeType;
//		}
//
//		public int[] getIncludeMimes() {
//			return includeMimes;
//		}
//
//		public void setIncludeMimes(int[] includeMimes) {
//			this.includeMimes = includeMimes;
//		}
//
//		public int getScreenPosition() {
//			return screenPosition;
//		}
//
//		public void setScreenPosition(int screenPosition) {
//			this.screenPosition = screenPosition;
//		}
//
//		public String getTargetUrl() {
//			return targetUrl;
//		}
//
//		public void setTargetUrl(String targetUrl) {
//			this.targetUrl = targetUrl;
//		}
//
//		public int getPriority() {
//			return priority;
//		}
//
//		public void setPriority(int priority) {
//			this.priority = priority;
//		}
//
//		public long getStrategyId() {
//			return strategyId;
//		}
//
//		public void setStrategyId(long strategyId) {
//			this.strategyId = strategyId;
//		}
//
//		public long getCreativeId() {
//			return creativeId;
//		}
//
//		public void setCreativeId(long creativeId) {
//			this.creativeId = creativeId;
//		}
//
//		public int getCampaignId() {
//			return campaignId;
//		}
//
//		public void setCampaignId(int campaignId) {
//			this.campaignId = campaignId;
//		}
//
//		public int getAdFormat() {
//			return adFormat;
//		}
//
//		public void setAdFormat(int adFormat) {
//			this.adFormat = adFormat;
//		}
//
//		public BigDecimal getPrice() {
//			return price;
//		}
//
//		public void setPrice(BigDecimal price) {
//			this.price = price;
//		}
//
//		public String getFeeType() {
//			return feeType;
//		}
//
//		public void setFeeType(String feeType) {
//			this.feeType = feeType;
//		}
//
//		public int getInteractionType() {
//			return interactionType;
//		}
//
//		public void setInteractionType(int interactionType) {
//			this.interactionType = interactionType;
//		}
//
//		public long getMaterialId() {
//			return materialId;
//		}
//
//		public void setMaterialId(long materialId) {
//			this.materialId = materialId;
//		}
//
//		public String getMaterialUrl() {
//			return materialUrl;
//		}
//
//		public void setMaterialUrl(String materialUrl) {
//			this.materialUrl = materialUrl;
//		}
//
//		public int getWidth() {
//			return width;
//		}
//
//		public void setWidth(int width) {
//			this.width = width;
//		}
//
//		public int getHeight() {
//			return height;
//		}
//
//		public void setHeight(int height) {
//			this.height = height;
//		}
//
//		public int getTemplateId() {
//			return templateId;
//		}
//
//		public void setTemplateId(int templateId) {
//			this.templateId = templateId;
//		}
//
//		public Set<AdMaterialGroup> getAdMaterialGroups() {
//			return adMaterialGroups;
//		}
//
//		public void setAdMaterialGroups(Set<AdMaterialGroup> adMaterialGroups) {
//			this.adMaterialGroups = adMaterialGroups;
//		}
//
//		public RequestAsset[] getAssets() {
//			return assets;
//		}
//
//		public void setAssets(RequestAsset[] assets) {
//			this.assets = assets;
//		}
//
//		public String getImpressionTracking() {
//			return impressionTracking;
//		}
//
//		public void setImpressionTracking(String impressionTracking) {
//			this.impressionTracking = impressionTracking;
//		}
//
//		public String getClicksTracking() {
//			return clicksTracking;
//		}
//
//		public void setClicksTracking(String clicksTracking) {
//			this.clicksTracking = clicksTracking;
//		}
//
//		public Object clone() {
//			Entry entry = null;
//
//			try {
//				entry = (Entry) super.clone();
//			} catch (CloneNotSupportedException e) {
//				;
//			}
//
//			return entry;
//		}
//
//	}
//
//	@PostConstruct
//	public void adViewInit() {
//		matcherChain = new ArrayList<>();
//		matcherChain.add(new StrategyFormatMatcher());
//		matcherChain.add(new TimeRangeMatcher());
//		matcherChain.add(SpringContextUtils.getBean(BidFloorMatcher.class));
//		matcherChain.add(new GeoTargetMatcher());
//		matcherChain.add(new DeviceMatcher());
//		matcherChain.add(new DayTargetMatcher());
//		matcherChain.add(new CreativeInteractionMatcher());//添加创意交互过滤。
//		matcherChain.add(new BalanceMatcher());
//	}
//
//	private void fetchCreativeTargetUrl(Creative creative, Entry entry) {
//
//		// 获取对应的动作类型
//		ActionType actionType = ActionType.actionTypeMap.get(creative.getInteractionType());
//
//		if (actionType == ActionType.LINK_JUMP) {
//			InteractionRedirects interactionRedirects = creative.getInteractionRedirects();
//			if (interactionRedirects != null) {
//				entry.targetUrl = interactionRedirects.getTargetUrl();
//			}
//		} else if (actionType == ActionType.APP_DOWNLOAD) {
//			InteractionApp interactionApp = creative.getInteractionApp();
//			if (interactionApp != null) {
//				entry.targetUrl = interactionApp.getDownloadUrl();
//			}
//		}
//
//		entry.interactionType = AdViewActionType.FORMAT_MAP.get(actionType);
//	}
//
//	private Set<Entry> priorityEntry(Set<Entry> entryList) {
//
//		if (entryList.size() == 1) {
//			return entryList;
//		}
//
//		int minPriority = 0;
//		Set<Entry> filterEntry = new HashSet<>(entryList.size());
//		for (Entry entry : entryList) {
//			int priority = entry.priority;
//			if (minPriority == 0) {
//				minPriority = priority;
//				filterEntry.add(entry);
//			} else {
//				if (priority < minPriority) {
//					filterEntry.clear();
//					filterEntry.add(entry);
//					minPriority = priority;
//				} else if (priority == minPriority) {
//					filterEntry.add(entry);
//				}
//			}
//		}
//
//		return filterEntry;
//
//	}
//
//	/**
//	 * 记录竞价信息
//	 *
//	 * @param bidContext
//	 * @param entry
//	 */
//	private void bidRecordLog(BidContext bidContext, Entry entry) {
//
//		bidContext.setCampaignId(entry.campaignId);
//		bidContext.setStrategyId(entry.strategyId);
//		bidContext.setCreativeId(entry.creativeId);
//		bidContext.setTemplateId(entry.templateId);
//		bidContext.setMaterialId(entry.getMaterialId());
//		// 实际出价
//		bidContext.setBidPrice(entry.getPrice() != null ? entry.getPrice().doubleValue() : 0.0);
//
//		bidContext.setBidPriceType(entry.feeType);
//		bidContext.setFlag(BidFlag.SUCCESS.getValue());
//
//	}
//
//	// TODO 将系统中所有生成 GUID的方法整合到一个方法中
//	private void storeGuid(BidContext bidContext, Entry entry) {
//
//		// 生成guid
//		GuidValueObject guidVo = new GuidValueObject();
//		guidVo.setAid(entry.getAdSpaceId());
//		guidVo.setSid(entry.strategyId);
//		guidVo.setCid(entry.creativeId);
//		guidVo.setMid(entry.materialId);
//		guidVo.setCampaignId(entry.getCampaignId());
//		guidVo.setMuniqueId(bidContext.getMuniqueId());
//		guidVo.setMuniqueType(bidContext.getMuniqueType());
//		guidVo.setBrand(bidContext.getBrand());
//		guidVo.setOs(bidContext.getOs());
//		guidVo.setPlatform(bidContext.getModal());
//		guidVo.setDeviceSize(bidContext.getScreenWidth() + "*" + bidContext.getScreenHeight());
//		guidVo.setNetwork(bidContext.getConnType());
//		guidVo.setOperator(bidContext.getMobOps());
//		guidVo.setIp(bidContext.getIp());
//		guidVo.setLongitude(bidContext.getLongitude());
//		guidVo.setLatitude(bidContext.getLatitude());
//		guidVo.setDeviceType(bidContext.getDeviceType());
//
//		guidVo.setMac(bidContext.getMac());
//		guidVo.setMac1(bidContext.getMac1());
//		guidVo.setImei(bidContext.getImei());
//		guidVo.setAnid(bidContext.getAnid());
//		guidVo.setAaid(bidContext.getAaid());
//		guidVo.setIdfa(bidContext.getIdfa());
//		guidVo.setUdid(bidContext.getUdid());
//		guidVo.setDuid(bidContext.getDuid());
//
//		guidVo.setImeisha1(bidContext.getImeisha1());
//		guidVo.setDpidsha1(bidContext.getDpidsha1());
//		guidVo.setMacsha1(bidContext.getMacsha1());
//		guidVo.setImeimd5(bidContext.getImeimd5());
//		guidVo.setDpidmd5(bidContext.getDpidmd5());
//		guidVo.setMacmd5(bidContext.getMacmd5());
//		guidVo.setCustomId(bidContext.getCustomId());
//
//		guidVo.setOpenUdid(bidContext.getOpenUdid());
//		guidVo.setFid(bidContext.getAdFormat());
//		guidVo.setTemplateId(bidContext.getTemplateId());
//		
//		
//		
//		bidContext.setGuid(adService.storeGuid(guidVo, bidContext.getAdxType()));
//	}
//	
////	/**
////	 * 填充TrackCommand
////	 * 
////	 * 注：STSAdRequestAction，STSAdProcessor，ImpressionHandler，ImpressionMatchService 中为同一份,有点不同。代码冗余。
////	 * @param bidContext
////	 * @param command
////	 * @return
////	 */
////	protected TrackCommand populateCommand(BidContext bidContext,TrackCommand command){
////		if(command==null){
////			command = new TrackCommand();
////		}
//////		os={os}&mac={mac}&mac_md5={mac_md5}&idfa={idfa}
//////		&idfa_md5={idfa_md5}&imei={imei}&imei_md5={imei_md5}&
//////		androidid={androidid}&androidid_md5={androidid_md5}
//////		&aid={aid}&sid={sid}&cid={cid}&mid={mid}&guid={guid}
////		command.setOs(bidContext.getOs());
////		command.setMac(bidContext.getMac());
////		command.setMac_md5(bidContext.getMacmd5());
////		command.setIdfa(bidContext.getIdfa());
////		command.setIdfa_md5(bidContext.getDpidmd5());
////		command.setImei(bidContext.getImei());
////		command.setImei_md5(bidContext.getImeimd5());
////		command.setAndroidid(bidContext.getAnid());
////		command.setAndroidid_md5(bidContext.getDpidmd5());
////		command.setAid(0l);
////		command.setSid(bidContext.getStrategyId());
////		command.setCid(bidContext.getCreativeId());
////		command.setMid(bidContext.getMaterialId());
////		command.setGuid(bidContext.getGuid());
////		return command;
////	}
////	
//
//}
